package principe.inversion.improve;

/**
 * 三种依赖传递：
 * 1、接口传递
 * 2、构造方法传递
 * 3、setter传递
 */
public class DependencyPass {
    public static void main(String[] args) {
//        IOpenAndClose openAndClose = new OpenAndClose();
//        openAndClose.open(new Honor());
//        IOpenAndClose openAndClose = new OpenAndClose(new Honor());
//        openAndClose.open();

//        IOpenAndClose openAndClose = new OpenAndClose();
//        openAndClose.setTv(new Honor());
//        openAndClose.open();
    }
}

//方式1：使用接口进行依赖传递


//开关接口
interface IOpenAndClose {
    void open(ITV itv);//抽象方法，接收接口
}

//ITV接口
interface ITV {
    void play();
}

class Honor implements ITV {

    @Override
    public void play() {
        System.out.println("荣耀智慧屏");
    }
}

//实现开关接口
class OpenAndClose implements IOpenAndClose {

    @Override
    public void open(ITV itv) {
        itv.play();
    }
}

////方法2：使用构造方法传递
//
//interface IOpenAndClose {
//    void open();//抽象方法
//}
//
//interface ITV {
//    void play();
//}
//
//class OpenAndClose implements IOpenAndClose {
//    private final ITV itv;//成员变量
//
//    public OpenAndClose(ITV itv) {//构造器
//        this.itv = itv;
//    }
//
//    @Override
//    public void open() {
//        itv.play();
//    }
//}
//
////方式3：通过setter方法传递
//
//interface IOpenAndClose {
//    void open();//抽象方法
//
//    void setTv(ITV itv);
//}
//
//interface ITV {
//    void play();
//}
//
//class OpenAndClose implements IOpenAndClose {
//    private ITV itv;
//
//    @Override
//    public void open() {
//        itv.play();
//    }
//
//    @Override
//    public void setTv(ITV itv) {
//        this.itv = itv;
//    }
//}